﻿#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<vector>
using namespace std;

//class animal
//{
//public:
//	void eat()
//	{}
//
//	void sleep()
//	{}
//
//protected:
//	int age=3;
//	string name;
//	string color="黄色";
//};
//
//class Cat :public animal
//{
//public:
//	void Grapmouse()
//	{}
//
//protected:
//	string address="安徽";
//	string name="mimi";
//
//};
//
//class Dog :public animal
//{
//public:
//	void bark()
//	{}
//
//protected:
//	string food="骨头";
//	string name="wangwang";
//
//};
//
//
//int main()
//{
//	Cat mimi;
//	Dog wangwang;
//	return 0;
//}

////实例展示不同限定访问符与继承方式
//class animal
//{
//public:
//	void eat()
//	{}
//protected:
//	int age = 3;
//private:
//	int id = 110;
//};
//
//class Cat :private animal
////class Cat :protected animal
////class Cat :public animal
//{
//public:
//	void mouse()
//	{}
//protected:
//	string name="mimi";
//private:
//	string food = "fish";
//};
//
//int main()
//{
//	Cat a;
//	a.mouse();
//	return 0;
//}

//namespace hjc
//{
//	//template<class T>
//	//class vector
//	//{};
//	// stack和vector的关系，既符合is-a，也符合has-a 
//	template<class T>
//	class stack : public vector<T>
//	{
//	public:
//		void push(const T& x)
//		{
//			// 基类是类模板时，需要指定⼀下类域， 
//			// 否则编译报错:error C3861: “push_back”: 找不到标识符 
//			// 因为stack<int>实例化时，也实例化vector<int>了 
//			// 但是模版是按需实例化，push_back等成员函数未实例化，所以找不到 
//			vector<T>::push_back(x);
//			//push_back(x);
//		}
//		void pop()
//		{
//			vector<T>::pop_back();
//		}
//		const T& top()
//		{
//			return vector<T>::back();
//		}
//		bool empty()
//		{
//			return vector<T>::empty();
//		}
//	};
//}
//int main()
//{
//	hjc::stack<int> st;
//	st.push(1);
//	st.push(2);
//	st.push(3);
//	while (!st.empty())
//	{
//		cout << st.top() << " ";
//		st.pop();
//	}
//	return 0;
//}

//int main()
//{
//	double d = 1.01;
//	int i = &d;
//
//	string s1 = "123456";
//	string &s2 = "21346"
//
//	return 0;
//}

//
//class Person
//{
//public:
//
//protected:
//	int num = 12345; //身份证号码
//	int age = 18;
//};
//
//class Student :public Person
//{
//public:
//	void print()
//	{
//		cout << Person::num << endl;
//		cout << num << endl;
//	}
//protected:
//	int num = 999; //学号
//};
//
//int main()
//{
//	Student s;
//	s.print();
//	return 0;
//}

#include <iostream>

class A {
public:
    A() { std::cout << "A的构造函数被调用\n"; }
    ~A() { std::cout << "A的析构函数被调用\n"; }
};

class B : virtual public A {
public:
    B() { std::cout << "B的构造函数被调用\n"; }
    ~B() { std::cout << "B的析构函数被调用\n"; }
};

class C : virtual public A {
public:
    C() { std::cout << "C的构造函数被调用\n"; }
    ~C() { std::cout << "C的析构函数被调用\n"; }
};

class D : public B, public C {
public:
    D() { std::cout << "D的构造函数被调用\n"; }
    ~D() { std::cout << "D的析构函数被调用\n"; }
};

int main() {
    D obj;
    return 0;
}